package com.lk.sys.service.impl;

import com.lk.sys.common.exception.ServiceException;
import com.lk.sys.common.vo.PageObject;
import com.lk.sys.dao.SysLogDao;
import com.lk.sys.entity.SysLog;
import com.lk.sys.service.SysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.NoSuchElementException;

/**
 * @author Lukang
 * @date 2021/10/25
 * @apiNote
 */
@Service
public class SysLogServiceImpl implements SysLogService {
    @Autowired
    private SysLogDao sysLogDao;

    /**
     * 将日志数据插入到数据库
     * @author Lukang
     * @date 2022/1/10 下午11:11
     * @param entity
     */
    //写日志的事务独立运行，不参与其他事务
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Async//该注解描述的方法执行时会在异步线程中执行，要在启动类中使用@EnableAsync注解使用
    @Override
    public void saveLog(SysLog entity) {
        String threadName = Thread.currentThread().getName();
        System.out.println("saveLog-->"+threadName);
        sysLogDao.insertObject(entity);
    }

    @Override
    public PageObject<SysLog> findPageObjects(String username, Long pageCurrent) {
        //参数校验, 用户名允许为空, 为空时查询所有, pageCurrent可以为空, 可默认查询第一页
        if (pageCurrent == null || pageCurrent < 1)
            throw new IllegalArgumentException("页码值不正确");
        //查询总记录数并校验
        long rowCount = sysLogDao.getRowCount(username);
        if (rowCount == 0)
            throw new ServiceException("没有查找到对应的记录");
        //查询当前页记录
        int pageSize = 5;
        long startIndex = (pageCurrent - 1) * pageSize;
        List<SysLog> records = sysLogDao.findPageObjects(username, startIndex, pageSize);
        //对查询结果进行封装
        return new PageObject<>(records, rowCount, pageSize, pageCurrent);
    }

    /**
     * 基于id删除选中的内容
     * @author Lukang
     * @date 2021/10/28 下午10:07
     * @param ids
     * @return int
     */
    @Override
    public int deleteObjects(int... ids) {
        //对参数进行判断
        if (ids == null || ids.length < 0)
            throw new IllegalArgumentException("请先选择要删除的数据");
        int rows = sysLogDao.deleteObjects(ids);
        if (rows == 0)
            throw new ServiceException("您选中的数据中可能有的数据已经被删除了，请刷新后重试");
        return rows;
    }
}
